package qldc.pm.qlktcsdldc.service.persistence;

import com.liferay.portal.kernel.cache.CacheRegistryUtil;
import com.liferay.portal.kernel.dao.orm.EntityCacheUtil;
import com.liferay.portal.kernel.dao.orm.FinderCacheUtil;
import com.liferay.portal.kernel.dao.orm.FinderPath;
import com.liferay.portal.kernel.dao.orm.Query;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.InstanceFactory;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.UnmodifiableList;
import com.liferay.portal.model.CacheModel;
import com.liferay.portal.model.ModelListener;
import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;

import qldc.pm.qlktcsdldc.NoSuchLichSuCongDanException;
import qldc.pm.qlktcsdldc.model.LichSuCongDan;
import qldc.pm.qlktcsdldc.model.impl.LichSuCongDanImpl;
import qldc.pm.qlktcsdldc.model.impl.LichSuCongDanModelImpl;
import qldc.pm.qlktcsdldc.service.persistence.LichSuCongDanPersistence;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * The persistence implementation for the lich su cong dan service.
 *
 * <p>
 * Caching information and settings can be found in <code>portal.properties</code>
 * </p>
 *
 * @author Brian Wing Shun Chan
 * @see LichSuCongDanPersistence
 * @see LichSuCongDanUtil
 * @generated
 */
public class LichSuCongDanPersistenceImpl extends BasePersistenceImpl<LichSuCongDan>
    implements LichSuCongDanPersistence {
    /*
     * NOTE FOR DEVELOPERS:
     *
     * Never modify or reference this class directly. Always use {@link LichSuCongDanUtil} to access the lich su cong dan persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
     */
    public static final String FINDER_CLASS_NAME_ENTITY = LichSuCongDanImpl.class.getName();
    public static final String FINDER_CLASS_NAME_LIST_WITH_PAGINATION = FINDER_CLASS_NAME_ENTITY +
        ".List1";
    public static final String FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION = FINDER_CLASS_NAME_ENTITY +
        ".List2";
    public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_ALL = new FinderPath(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
            LichSuCongDanModelImpl.FINDER_CACHE_ENABLED,
            LichSuCongDanImpl.class, FINDER_CLASS_NAME_LIST_WITH_PAGINATION,
            "findAll", new String[0]);
    public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
            LichSuCongDanModelImpl.FINDER_CACHE_ENABLED,
            LichSuCongDanImpl.class, FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION,
            "findAll", new String[0]);
    public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
            LichSuCongDanModelImpl.FINDER_CACHE_ENABLED, Long.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countAll", new String[0]);
    private static final String _SQL_SELECT_LICHSUCONGDAN = "SELECT lichSuCongDan FROM LichSuCongDan lichSuCongDan";
    private static final String _SQL_COUNT_LICHSUCONGDAN = "SELECT COUNT(lichSuCongDan) FROM LichSuCongDan lichSuCongDan";
    private static final String _ORDER_BY_ENTITY_ALIAS = "lichSuCongDan.";
    private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No LichSuCongDan exists with the primary key ";
    private static final boolean _HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE = GetterUtil.getBoolean(PropsUtil.get(
                PropsKeys.HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE));
    private static Log _log = LogFactoryUtil.getLog(LichSuCongDanPersistenceImpl.class);
    private static LichSuCongDan _nullLichSuCongDan = new LichSuCongDanImpl() {
            @Override
            public Object clone() {
                return this;
            }

            @Override
            public CacheModel<LichSuCongDan> toCacheModel() {
                return _nullLichSuCongDanCacheModel;
            }
        };

    private static CacheModel<LichSuCongDan> _nullLichSuCongDanCacheModel = new CacheModel<LichSuCongDan>() {
            @Override
            public LichSuCongDan toEntityModel() {
                return _nullLichSuCongDan;
            }
        };

    public LichSuCongDanPersistenceImpl() {
        setModelClass(LichSuCongDan.class);
    }

    /**
     * Caches the lich su cong dan in the entity cache if it is enabled.
     *
     * @param lichSuCongDan the lich su cong dan
     */
    @Override
    public void cacheResult(LichSuCongDan lichSuCongDan) {
        EntityCacheUtil.putResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
            LichSuCongDanImpl.class, lichSuCongDan.getPrimaryKey(),
            lichSuCongDan);

        lichSuCongDan.resetOriginalValues();
    }

    /**
     * Caches the lich su cong dans in the entity cache if it is enabled.
     *
     * @param lichSuCongDans the lich su cong dans
     */
    @Override
    public void cacheResult(List<LichSuCongDan> lichSuCongDans) {
        for (LichSuCongDan lichSuCongDan : lichSuCongDans) {
            if (EntityCacheUtil.getResult(
                        LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
                        LichSuCongDanImpl.class, lichSuCongDan.getPrimaryKey()) == null) {
                cacheResult(lichSuCongDan);
            } else {
                lichSuCongDan.resetOriginalValues();
            }
        }
    }

    /**
     * Clears the cache for all lich su cong dans.
     *
     * <p>
     * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
     * </p>
     */
    @Override
    public void clearCache() {
        if (_HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE) {
            CacheRegistryUtil.clear(LichSuCongDanImpl.class.getName());
        }

        EntityCacheUtil.clearCache(LichSuCongDanImpl.class.getName());

        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_ENTITY);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
    }

    /**
     * Clears the cache for the lich su cong dan.
     *
     * <p>
     * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
     * </p>
     */
    @Override
    public void clearCache(LichSuCongDan lichSuCongDan) {
        EntityCacheUtil.removeResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
            LichSuCongDanImpl.class, lichSuCongDan.getPrimaryKey());

        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
    }

    @Override
    public void clearCache(List<LichSuCongDan> lichSuCongDans) {
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);

        for (LichSuCongDan lichSuCongDan : lichSuCongDans) {
            EntityCacheUtil.removeResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
                LichSuCongDanImpl.class, lichSuCongDan.getPrimaryKey());
        }
    }

    /**
     * Creates a new lich su cong dan with the primary key. Does not add the lich su cong dan to the database.
     *
     * @param LichSuCongDanId the primary key for the new lich su cong dan
     * @return the new lich su cong dan
     */
    @Override
    public LichSuCongDan create(long LichSuCongDanId) {
        LichSuCongDan lichSuCongDan = new LichSuCongDanImpl();

        lichSuCongDan.setNew(true);
        lichSuCongDan.setPrimaryKey(LichSuCongDanId);

        return lichSuCongDan;
    }

    /**
     * Removes the lich su cong dan with the primary key from the database. Also notifies the appropriate model listeners.
     *
     * @param LichSuCongDanId the primary key of the lich su cong dan
     * @return the lich su cong dan that was removed
     * @throws qldc.pm.qlktcsdldc.NoSuchLichSuCongDanException if a lich su cong dan with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public LichSuCongDan remove(long LichSuCongDanId)
        throws NoSuchLichSuCongDanException, SystemException {
        return remove((Serializable) LichSuCongDanId);
    }

    /**
     * Removes the lich su cong dan with the primary key from the database. Also notifies the appropriate model listeners.
     *
     * @param primaryKey the primary key of the lich su cong dan
     * @return the lich su cong dan that was removed
     * @throws qldc.pm.qlktcsdldc.NoSuchLichSuCongDanException if a lich su cong dan with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public LichSuCongDan remove(Serializable primaryKey)
        throws NoSuchLichSuCongDanException, SystemException {
        Session session = null;

        try {
            session = openSession();

            LichSuCongDan lichSuCongDan = (LichSuCongDan) session.get(LichSuCongDanImpl.class,
                    primaryKey);

            if (lichSuCongDan == null) {
                if (_log.isWarnEnabled()) {
                    _log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
                }

                throw new NoSuchLichSuCongDanException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
                    primaryKey);
            }

            return remove(lichSuCongDan);
        } catch (NoSuchLichSuCongDanException nsee) {
            throw nsee;
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }
    }

    @Override
    protected LichSuCongDan removeImpl(LichSuCongDan lichSuCongDan)
        throws SystemException {
        lichSuCongDan = toUnwrappedModel(lichSuCongDan);

        Session session = null;

        try {
            session = openSession();

            if (!session.contains(lichSuCongDan)) {
                lichSuCongDan = (LichSuCongDan) session.get(LichSuCongDanImpl.class,
                        lichSuCongDan.getPrimaryKeyObj());
            }

            if (lichSuCongDan != null) {
                session.delete(lichSuCongDan);
            }
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }

        if (lichSuCongDan != null) {
            clearCache(lichSuCongDan);
        }

        return lichSuCongDan;
    }

    @Override
    public LichSuCongDan updateImpl(
        qldc.pm.qlktcsdldc.model.LichSuCongDan lichSuCongDan)
        throws SystemException {
        lichSuCongDan = toUnwrappedModel(lichSuCongDan);

        boolean isNew = lichSuCongDan.isNew();

        Session session = null;

        try {
            session = openSession();

            if (lichSuCongDan.isNew()) {
                session.save(lichSuCongDan);

                lichSuCongDan.setNew(false);
            } else {
                session.merge(lichSuCongDan);
            }
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }

        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);

        if (isNew) {
            FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
        }

        EntityCacheUtil.putResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
            LichSuCongDanImpl.class, lichSuCongDan.getPrimaryKey(),
            lichSuCongDan);

        return lichSuCongDan;
    }

    protected LichSuCongDan toUnwrappedModel(LichSuCongDan lichSuCongDan) {
        if (lichSuCongDan instanceof LichSuCongDanImpl) {
            return lichSuCongDan;
        }

        LichSuCongDanImpl lichSuCongDanImpl = new LichSuCongDanImpl();

        lichSuCongDanImpl.setNew(lichSuCongDan.isNew());
        lichSuCongDanImpl.setPrimaryKey(lichSuCongDan.getPrimaryKey());

        lichSuCongDanImpl.setLichSuCongDanId(lichSuCongDan.getLichSuCongDanId());
        lichSuCongDanImpl.setGroupId(lichSuCongDan.getGroupId());
        lichSuCongDanImpl.setCompanyId(lichSuCongDan.getCompanyId());
        lichSuCongDanImpl.setUserId(lichSuCongDan.getUserId());
        lichSuCongDanImpl.setUserName(lichSuCongDan.getUserName());
        lichSuCongDanImpl.setCreateDate(lichSuCongDan.getCreateDate());
        lichSuCongDanImpl.setModifiedDate(lichSuCongDan.getModifiedDate());

        return lichSuCongDanImpl;
    }

    /**
     * Returns the lich su cong dan with the primary key or throws a {@link com.liferay.portal.NoSuchModelException} if it could not be found.
     *
     * @param primaryKey the primary key of the lich su cong dan
     * @return the lich su cong dan
     * @throws qldc.pm.qlktcsdldc.NoSuchLichSuCongDanException if a lich su cong dan with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public LichSuCongDan findByPrimaryKey(Serializable primaryKey)
        throws NoSuchLichSuCongDanException, SystemException {
        LichSuCongDan lichSuCongDan = fetchByPrimaryKey(primaryKey);

        if (lichSuCongDan == null) {
            if (_log.isWarnEnabled()) {
                _log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
            }

            throw new NoSuchLichSuCongDanException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
                primaryKey);
        }

        return lichSuCongDan;
    }

    /**
     * Returns the lich su cong dan with the primary key or throws a {@link qldc.pm.qlktcsdldc.NoSuchLichSuCongDanException} if it could not be found.
     *
     * @param LichSuCongDanId the primary key of the lich su cong dan
     * @return the lich su cong dan
     * @throws qldc.pm.qlktcsdldc.NoSuchLichSuCongDanException if a lich su cong dan with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public LichSuCongDan findByPrimaryKey(long LichSuCongDanId)
        throws NoSuchLichSuCongDanException, SystemException {
        return findByPrimaryKey((Serializable) LichSuCongDanId);
    }

    /**
     * Returns the lich su cong dan with the primary key or returns <code>null</code> if it could not be found.
     *
     * @param primaryKey the primary key of the lich su cong dan
     * @return the lich su cong dan, or <code>null</code> if a lich su cong dan with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public LichSuCongDan fetchByPrimaryKey(Serializable primaryKey)
        throws SystemException {
        LichSuCongDan lichSuCongDan = (LichSuCongDan) EntityCacheUtil.getResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
                LichSuCongDanImpl.class, primaryKey);

        if (lichSuCongDan == _nullLichSuCongDan) {
            return null;
        }

        if (lichSuCongDan == null) {
            Session session = null;

            try {
                session = openSession();

                lichSuCongDan = (LichSuCongDan) session.get(LichSuCongDanImpl.class,
                        primaryKey);

                if (lichSuCongDan != null) {
                    cacheResult(lichSuCongDan);
                } else {
                    EntityCacheUtil.putResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
                        LichSuCongDanImpl.class, primaryKey, _nullLichSuCongDan);
                }
            } catch (Exception e) {
                EntityCacheUtil.removeResult(LichSuCongDanModelImpl.ENTITY_CACHE_ENABLED,
                    LichSuCongDanImpl.class, primaryKey);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return lichSuCongDan;
    }

    /**
     * Returns the lich su cong dan with the primary key or returns <code>null</code> if it could not be found.
     *
     * @param LichSuCongDanId the primary key of the lich su cong dan
     * @return the lich su cong dan, or <code>null</code> if a lich su cong dan with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public LichSuCongDan fetchByPrimaryKey(long LichSuCongDanId)
        throws SystemException {
        return fetchByPrimaryKey((Serializable) LichSuCongDanId);
    }

    /**
     * Returns all the lich su cong dans.
     *
     * @return the lich su cong dans
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<LichSuCongDan> findAll() throws SystemException {
        return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
    }

    /**
     * Returns a range of all the lich su cong dans.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link qldc.pm.qlktcsdldc.model.impl.LichSuCongDanModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param start the lower bound of the range of lich su cong dans
     * @param end the upper bound of the range of lich su cong dans (not inclusive)
     * @return the range of lich su cong dans
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<LichSuCongDan> findAll(int start, int end)
        throws SystemException {
        return findAll(start, end, null);
    }

    /**
     * Returns an ordered range of all the lich su cong dans.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link qldc.pm.qlktcsdldc.model.impl.LichSuCongDanModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param start the lower bound of the range of lich su cong dans
     * @param end the upper bound of the range of lich su cong dans (not inclusive)
     * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
     * @return the ordered range of lich su cong dans
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<LichSuCongDan> findAll(int start, int end,
        OrderByComparator orderByComparator) throws SystemException {
        boolean pagination = true;
        FinderPath finderPath = null;
        Object[] finderArgs = null;

        if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
                (orderByComparator == null)) {
            pagination = false;
            finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL;
            finderArgs = FINDER_ARGS_EMPTY;
        } else {
            finderPath = FINDER_PATH_WITH_PAGINATION_FIND_ALL;
            finderArgs = new Object[] { start, end, orderByComparator };
        }

        List<LichSuCongDan> list = (List<LichSuCongDan>) FinderCacheUtil.getResult(finderPath,
                finderArgs, this);

        if (list == null) {
            StringBundler query = null;
            String sql = null;

            if (orderByComparator != null) {
                query = new StringBundler(2 +
                        (orderByComparator.getOrderByFields().length * 3));

                query.append(_SQL_SELECT_LICHSUCONGDAN);

                appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
                    orderByComparator);

                sql = query.toString();
            } else {
                sql = _SQL_SELECT_LICHSUCONGDAN;

                if (pagination) {
                    sql = sql.concat(LichSuCongDanModelImpl.ORDER_BY_JPQL);
                }
            }

            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(sql);

                if (!pagination) {
                    list = (List<LichSuCongDan>) QueryUtil.list(q,
                            getDialect(), start, end, false);

                    Collections.sort(list);

                    list = new UnmodifiableList<LichSuCongDan>(list);
                } else {
                    list = (List<LichSuCongDan>) QueryUtil.list(q,
                            getDialect(), start, end);
                }

                cacheResult(list);

                FinderCacheUtil.putResult(finderPath, finderArgs, list);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(finderPath, finderArgs);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return list;
    }

    /**
     * Removes all the lich su cong dans from the database.
     *
     * @throws SystemException if a system exception occurred
     */
    @Override
    public void removeAll() throws SystemException {
        for (LichSuCongDan lichSuCongDan : findAll()) {
            remove(lichSuCongDan);
        }
    }

    /**
     * Returns the number of lich su cong dans.
     *
     * @return the number of lich su cong dans
     * @throws SystemException if a system exception occurred
     */
    @Override
    public int countAll() throws SystemException {
        Long count = (Long) FinderCacheUtil.getResult(FINDER_PATH_COUNT_ALL,
                FINDER_ARGS_EMPTY, this);

        if (count == null) {
            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(_SQL_COUNT_LICHSUCONGDAN);

                count = (Long) q.uniqueResult();

                FinderCacheUtil.putResult(FINDER_PATH_COUNT_ALL,
                    FINDER_ARGS_EMPTY, count);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(FINDER_PATH_COUNT_ALL,
                    FINDER_ARGS_EMPTY);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return count.intValue();
    }

    /**
     * Initializes the lich su cong dan persistence.
     */
    public void afterPropertiesSet() {
        String[] listenerClassNames = StringUtil.split(GetterUtil.getString(
                    com.liferay.util.service.ServiceProps.get(
                        "value.object.listener.qldc.pm.qlktcsdldc.model.LichSuCongDan")));

        if (listenerClassNames.length > 0) {
            try {
                List<ModelListener<LichSuCongDan>> listenersList = new ArrayList<ModelListener<LichSuCongDan>>();

                for (String listenerClassName : listenerClassNames) {
                    listenersList.add((ModelListener<LichSuCongDan>) InstanceFactory.newInstance(
                            getClassLoader(), listenerClassName));
                }

                listeners = listenersList.toArray(new ModelListener[listenersList.size()]);
            } catch (Exception e) {
                _log.error(e);
            }
        }
    }

    public void destroy() {
        EntityCacheUtil.removeCache(LichSuCongDanImpl.class.getName());
        FinderCacheUtil.removeCache(FINDER_CLASS_NAME_ENTITY);
        FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
    }
}
